package com.thread.threadfirst.studyThread3;

import java.util.concurrent.LinkedTransferQueue;

/**
 * 9、TransferQueue
 * 唯一的实现：LinkedTransferQueue
 * <p>
 * TransferQueue其他方法都和其他Queue的方法一样，只有一个特殊的方法transfer()
 * <p>
 * 有一个队列，它有好多个消费者，调用transfer()的生产者会首先看有没有消费者，如果有就绕过队列 直接将消息给了消费者；
 * 但如果没有找到消费者或消费者在忙 没空的话，此生产者线程就会等待 阻塞。
 * 比如游戏服务器，有多个client端，有一个client端发消息给其他client端，服务器接收到消息，分发给其他client端，那么服务器是有个消息队列的 接受消息 传递消息，
 * 如果在高并发情况下，有多个消费者等着生产者发送消息，那么这时如果还有队列的话，效率就太慢了，所以生产者调用transfer()来直接将消息发送给消费者，
 * 效率就高好多，效率高 服务器支持并发的client端就多。所以transfer()适用于更高的并发下。
 */
public class T7 {

    public static void main(String[] args) throws InterruptedException {
        LinkedTransferQueue<String> tasks = new LinkedTransferQueue<>();

        new Thread(() -> {  //如果此处的消费者注释掉，下面的消费者后启动，程序就会阻塞了。
            try {
                System.out.println(tasks.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        tasks.transfer("aaa");  //transfer()适用于更高的并发下。put()、offer()等都是正常放入队列的，只有transfer()是实时消息处理，不处理我的消息我就不走了。

        /*  如果生产者先生产消息 下面的消费者后启动，程序就会阻塞了，因为生产者发现没有消费者 就会阻塞。
        new Thread(()->{
            try {
                System.out.println(tasks.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
         */

    }


}
